/**
 * 项目名称:
 *
 * @Author: 夏国倩
 * @Date: 2023/10/16 17:15
 * @Copyright
 */
package JDBC;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/*
JDBC 事务机制：
   1.JDBC中事务是自动提交的，什么是自动提交？
      只要执行任意一条DML语句，则自动提交一次，这是IDBC默认的事务行为
      但是在实际业务当中，通过都是N条DML语句共同联合才能完成的，必须保证他们这些DML语句在同一个事务中同时成功或失败
   2.将自动提交改为手动提交
          conn.setAutoCommit(false); //开启事务
          conn.commit();
          conn.rollback();

      sql脚本
     drop table if exists t_act;
     create table t_act(
        actno int,
        balance double(7,2) //注意：7表示有效数字的个数，2表示小数位的个数
     };
     insert into t_act(actno,balance) values(111,20000);
     insert into t_act(actno,balance) values(222,0);
 */
public class JDBCtest10 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        try {
            //1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.获取连接
            conn = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/base7?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC",
                    "root",
                    "123456");
            //将自动提交机制修改为手动提交
            //conn.setAutoCommit(false); //开启事务
            //3.获取预编译的数据库操作对象
            String sql = "update t_act set balance=? where actno=?";
            ps = conn.prepareStatement(sql);

            //给?传值
            ps.setDouble(1, 10000);
            ps.setInt(2, 111);
            int count = ps.executeUpdate();

            String s=null;
            s.toString();

            //给?传值
            ps.setDouble(1, 10000);
            ps.setInt(2, 222);
            count += ps.executeUpdate();

            System.out.println(count == 2 ? "转账成功" : "转账失败");

            //程序能够走到这里说明以上程序没有异常，事务结束，手动提交数据
            conn.commit();

        } catch (Exception e) {
            //回滚事务
            /*if (conn != null) {
                try {
                    conn.rollback();
                } catch (SQLException ex) {
                    ex.printStackTrace();
                }
            }*/
            e.printStackTrace();
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }

    }
}
